//
// Created by Administrator on 2021/10/13.
//

#include "MatrixN.h"

/**
 * 构造
 * @param row 行数
 * @param col 列数
 */
MatrixN::MatrixN(int _row, int _col) : row(_row), col(_col){
    identity();
}

/**
 * 置为单位矩阵
 */
void MatrixN::identity() {
    for(int i = 0; i < row; i++){
        for(int j = 0; j < col; j++){
            data.push_back(i == j);
        }
    }
}

/**
 * 初始化数据
 * @param m 矩阵数列
 */
void MatrixN::init(const std::vector<float> &m) {
    HelloAssert::check(m.size() == data.size(), "矩阵行列数不一致，无法赋值");
    data = m;
}


/**
 * 乘法
 * @param m 矩阵
 * @return 乘法后结果
 */
MatrixN MatrixN::operator *(const MatrixN& m) const {
    return MatrixN::multiply(*this, m);
}

/**
 * 乘法
 * @param m1 矩阵1
 * @param m2 矩阵2
 * @return
 */
MatrixN MatrixN::multiply(const MatrixN& m1, const MatrixN& m2) {
    HelloAssert::check(m1.col == m2.row, "矩阵行->列不一致,无法相乘");

    MatrixN r(m1.row, m2.col);
    for(int i = 0; i < m1.row; i++){
        for(int k = 0; k < m1.col; k++){
            float sum = 0.0f;
            for(int j = 0; j < m2.row; j++){
                float m1r = m1.data[i * m1.row + j];
                float m2c = m2.data[j * m2.row + k];
                sum += m1r * m2c;
            }
            r.data[i * m1.row + k] = sum;
        }
    }

    return r;
}

/**
 * 格式化为string
 */
String MatrixN::toString(){
    String s("\n");
    for(int i = 0; i < this -> row; i++){
        s += "|";
        for(int j = 0; j < this->col; j++){
            s += String::float2string(data[i * this->row + j]);
            if(j != col - 1){
                s += ", ";
            }
        }
        s += "|\n";
    }
    return s;
}
